import pymysql
from pymysql.cursors import DictCursor
from utils.log_utils import log
from utils.config_util import ConfigUtil
import time  # 新增：用于重试间隔
from pymysql import OperationalError  # 新增：捕获数据库连接相关异常

class DBUtil:
    def __init__(self):
        self.config = ConfigUtil.get_db_config()
        self.conn = None
        self.cursor = None

    def connect(self, max_retries=3, retry_interval=2):
        """
        连接数据库（带失败重连机制）
        :param max_retries: 最大重试次数
        :param retry_interval: 重试间隔（秒）
        """
        for retry in range(max_retries):
            try:
                self.conn = pymysql.connect(
                    host=self.config["host"],
                    port=self.config["port"],
                    user=self.config["user"],
                    password=self.config["password"],
                    database=self.config["database"],
                    charset="utf8mb4"
                )
                self.cursor = self.conn.cursor(cursor=DictCursor)  # 返回字典格式
                log.info("数据库连接成功")
                return  # 连接成功则退出重试循环
            except OperationalError as e:  # 捕获连接相关异常（如网络问题、服务未启动）
                log.warning(f"数据库连接失败（第{retry + 1}次重试）：{e}")
                if retry < max_retries - 1:  # 不是最后一次重试则等待后继续
                    time.sleep(retry_interval)
            except Exception as e:  # 其他异常（如配置错误）直接抛出，无需重试
                log.error(f"数据库连接发生非重试异常：{e}")
                raise
        # 所有重试都失败后抛出异常
        log.error(f"超过最大重试次数（{max_retries}次），数据库连接失败")
        raise Exception(f"数据库连接失败，已重试{max_retries}次")

    def query_one(self, sql, args=None):
        """查询单条数据"""
        try:
            self.cursor.execute(sql, args)
            result = self.cursor.fetchone()
            log.info(f"执行查询SQL：{sql}，参数：{args}，结果：{result}")
            return result
        except Exception as e:
            log.error(f"查询失败：{e}")
            self.conn.rollback()
            raise

    def delete(self, sql, args=None):
        """删除数据（支持事务提交）"""
        try:
            # 执行删除SQL
            self.cursor.execute(sql, args)
            self.conn.commit()  # 提交事务（pymysql默认手动提交）
            log.info(f"执行删除SQL：{sql}，参数：{args}，删除行数：{self.cursor.rowcount}")
            return self.cursor.rowcount  # 返回受影响的行数（方便验证是否删除成功）
        except Exception as e:
            self.conn.rollback()  # 异常时回滚事务
            log.error(f"删除数据失败：{e}")
            raise

    def close(self):
        """关闭连接"""
        if self.cursor:
            self.cursor.close()
        if self.conn:
            self.conn.close()
        log.info("数据库连接已关闭")